【AWS IoT 入門】MQTTクライアントのMQTTXを利用して手を動かして学ぶ

【AWS IoT 入門】MQTTクライアントのMQTTXを利用して手を動かして学ぶ

AWS IoT Coreを始めるには、ラズパイ購入の前にPCにMQTTクライアントをインストールするだけでも基本動作を確認できます。本記事では、MQTTXを使用してAWS IoT Coreとの接続・通信方法を解説します。
Clock Icon2024.12.30

「AWS IoT初めて触ってみたいんだけれど、やっぱりラズパイ買うところから?」

「とりあえずPCにMQTTクライアント入れてやってみたらええで」

「IoT始めるならラズパイ買ってから!」と思う人も多いと思いますが、IoTでよく利用されるMQTTプロトコルにまず触れるには、手元のPCにMQTTクライアントをインストールして試してみるだけでも、十分AWS IoT Coreの基本的な動作は確認できます。

この記事では、AWS IoT Coreを始めて触ってみようという方に向けて、MQTTクライアントのMQTTXを利用したクライアントPCとAWS IoT CoreとのMQTT接続方法を、ステップバイステップでお届けします。

深淵なるAWS IoTの世界に触れる最初の一歩にこの記事がなれば幸いです。ほな、いってみよ!

なぜAWS IoT Coreを学ぶ時に、MQTTクライアントツールを使うのか?

クライアントの初期設定がめちゃくちゃ簡単だからです。

AWS IoT Coreを学ぶ時、実際的にはAWS IoT Coreに対して何かしらMQTTメッセージを送信する環境を用意する必要があります。

その場合代表的な選択肢として、IoTの文脈ではラズペリーパイやESP32などのエッジデバイスを用意し、そこからMQTTメッセージを送信する方法がよく採用されます。

これもめちゃくちゃ良い選択肢で、エッジデバイスで各種センサーを追加しそこからMQTTメッセージにセンサー情報を含めてみたり、逆にAWS IoT Coreからエッジデバイスにメッセージを送信してデバイスを制御するのも、エッジデバイスならではの醍醐味です。

ですが、物理的なモノを用意する必要があり、セットアップに時間がかかってしまうのが難点です。また、筆者の経験ですが、慣れていないうちはデバイスの問題とMQTT接続の問題の切り分けがうまくいかず学習に躓いてしまいがちです。

AWS IoT Coreを触るのが初めての場合、いきなりエッジデバイスを用意するのではなく、何らかのMQTTクライアントを手元のPCにインストールして、そこからMQTTメッセージを送受信してAWS IoT Coreの基本的な機能を掴んでみるところから始めるのも良いのかなと思ってます。

というわけで、自分なりにMQTTクライアントをいろいろ調べてみた結果、簡単に導入でき使い勝手が良さそうなMQTTXをこの記事では紹介しています。

MQTTXとはなにか?

MQTTXは、EMQXによって開発された、オール・イン・ワンのMQTTクライアントツール。公式ページは日本語化されているので読みやすい。

https://mqttx.app/ja

MQTTXは、デスクトップ、CLI(コマンドラインインターフェース)、Webアプリケーションの3つのインターフェースを提供するクロスプラットフォームのMQTT 5.0クライアントツールです。macOS、Linux、Windowsで動作し、MQTTメッセージ形式の変換をサポートしています。

主な特徴

  • ユーザーフレンドリーなインターフェース: チャットソフトウェアのようなUIを採用し、操作ロジックを簡素化しています。

  • MQTT/MQTTS接続: 複数のMQTT/MQTTS接続を簡単に作成し管理できます。

  • MQTT 5.0および3.1.1対応: 最新のMQTTプロトコルバージョンに完全対応しています。

  • セキュリティ機能: MQTT over TLS、MQTT over WebSocket、一方向および双方向SSL認証をサポートしています。

  • 高度な機能: カスタマイズ可能なPub/Subシミュレーションスクリプト、Hex、Base64、JSONペイロードなどのコーデックをサポートしています。

デスクトップ版のイメージです。オシャレな雰囲気で良いですね。

image.png

MQTTXの導入(Mac)

自分のクライアントPCはMacなので、MQTTXデスクトップのMac版を導入します。といっても導入方法は超簡単。公式ページ(Installation - MQTTX Documentation)を参照すればインストール方法は全て解説されているので、各人の環境でインストールしてみてください。

Homebrewが導入されているMacであれば、下記コマンドのみでインストールは完了です。

brew install --cask mqttx

こんな感じで、即起動しました。ありがたい。

CleanShot 2024-12-29 at 17.03.24@2x.png

2024年12月30日現在、自分が利用したバーションは、V1.11.1です。

AWS IoT 側の設定

いよいよ、MQTTXとAWS IoT Coreとの接続設定を行います。手順など、大きな流れは以下の通り。最初にAWS IoT側を設定します。

  • ポリシーの作成
  • モノの作成
  • 各種証明書をダウンロード
  • ドメインを取得

ポリシーの作成

  • マネジメントコンソールにアクセスし、AWS IoT Coreのメニューを開く
  • 左側のサイドメニューから[セキュリティ] -> [ポリシー]を選択し、[ポリシーを作成]ボタンをクリック

ポリシー作成画面が開くので、以下を入力。

  • ポリシー名:mqttx-policy
  • ポリシードキュメント
    • ポリシー効果:許可
    • ポリシーアクション:すべての AWS IoT アクションの下の*をクリック
    • ポリシーリソース:*

CleanShot 2024-12-29 at 21.57.48@2x.png

[作成]をクリックし、ポリシーが作成されていることを確認。

モノの作成と証明書のダウンロード

左側のサイドメニューから[すべてのデバイス] -> [モノ]を選択し、[モノを作成]をクリック。

モノを作成画面が表示されるので、[1つのものを作成]を選択し、[次へ]をクリック。モノのプロパティ画面が開くので、以下を入力。

CleanShot 2024-12-29 at 22.04.33@2x.png

  • モノの名前:mqttx-thing

CleanShot 2024-12-29 at 22.08.09.png

他はデフォルトで[次へ]をクリック。

CleanShot 2024-12-29 at 22.08.54.png

デバイス証明書画面が表示されるので[新しい証明書を自動作成(推奨)]を選択し、[次へ]をクリックすると、証明書にポリシーをアタッチ画面が表示されます。

CleanShot 2024-12-29 at 22.10.18.png

先程上の手順で作成したmqtt-policyを選択し、「モノを作成」をクリック。証明書とキーをダウンロード画面が表示される。

CleanShot 2024-12-29 at 22.27.26.png

以下4種類の証明書をダウンロードし、[完了]をクリック。

  • デバイス証明書
  • パブリックキーファイル
  • プライベートキーファイル
  • ルートCA証明書(Amazon信頼サービスエンドポイント)

ドメイン設定を取得

左側のサイドメニューから[接続] -> [ドメイン設定]をクリック。ドメイン設定一覧のドメイン名をコピーして控えておきます。これは、AWSアカウント側でデフォルトで用意されているエンドポイントです。

CleanShot 2024-12-29 at 22.38.24.png

他のドメインが必要な場合は、別途ドメインの作成もできますが、今回はこのデフォルトエンドポイントを利用します。

以上で、AWS IoT Core側の設定は完了です。

MQTTX側の設定

次にMQTTX側の設定を行います。MQTTXの画面を開き、左側の[+]をクリック。

CleanShot 2024-12-29 at 22.33.18.png

Connection作成画面が表示されるので、以下を入力。

  • Name:mqttx-client
  • Host:mqtts://を選択。ホスト名に前述の手順で取得したドメイン名を入力
  • Port:AWS IoT Coreのデフォルト8883を入力
  • SSL/TLS:オン
  • SSL Secure:オン
  • Certificate:CA or Self signed certificatesを選択
  • Certificates
    • CA File:前述の手順でダウンロードしたルートCA証明書(Amazon信頼サービスエンドポイント)
      • File名:AmazonRootCA1.pem
    • Client Certificate File:前述の手順でダウンロードしたデバイス証明書
      • File名:EXAMPLE-certificate.pem.crt
    • Client key file:前述の手順でダウンロードしたプライベートキーファイル
      • File名:EXAMPLE-private.pem.key

CleanShot 2024-12-29 at 22.58.56.png

一通り入力完了後、右上の[Connect]ボタンをクリックし、無事Connectedと表示されればOKです。上のここをクリックすると、現在の接続状況がわかります。また、後の動作確認で必要となるtopic名の入力欄も表示されています(ここでは、topic/mqttx)。

CleanShot 2024-12-29 at 23.02.41.png

接続確認前にMQTTの仕組みを理解する

ここまででAWS IoT Core側とMQTTX側の設定は完了しています。この後接続の動作確認を実施していきますが、 その前にMQTTの仕組みを理解しておくことを強くオススメします。 なぜならここが理解できていないと、この後の動作確認の内容がイメージしにくいためです。

いくらか資料を探しましたが、ここでは、MQTTXの開発元EMQXが提供する以下のブログ記事を紹介します。

https://www.emqx.com/ja/blog/the-easiest-guide-to-getting-started-with-mqtt

MQTTがIoTに最適なプロトコルの理由であることや、MQTTそのものの仕組みが非常にコンパクトにわかりやすくまとまっています。このブログ記事で、以下の単語について理解を深めておきましょう。

  • MQTTブローカー
  • パブリッシュ・サブスクライブ・パターン
  • トピック(特にスラッシュを利用した階層構造とワイルドカード)
  • サービス品質(QoS)

また、図解では、弊社よなみねのこちらの記事が非常にわかりやすくまとまっているので、上の記事と合わせて参照されることをオススメします。

イラストで理解するMQTT | DevelopersIO

MQTTXとAWS IoT Coreとの接続確認(MQTTXからパブリッシュ)

ここまでで準備は完了。ここから実際にMQTTXクライアントからメッセージを送信してAWS IoT Core側で受信してみます。

先述のMQTTXからのコネクションが確立している状態で、AWS IoT Coreのサイドメニューから、[テスト] -> [MQTTテストクライアント]を開きます。

AWS IoT Core側でMQTTXからのメッセージを受信するため、トピックのフィルターにtopic/mqttxを入力して、[サブスクライブ]ボタンをクリックします。そうすると、下側に指定したトピックフィルターに該当するサブスクリプションが表示されます。

CleanShot 2024-12-29 at 23.31.29.png

この状態で、MQTTX側でトピックにtopic/mqttxと入力しメッセージ送信します。

CleanShot 2024-12-29 at 23.34.22.png

そうすると、AWS IoT Core側のサブスクリプション側でMQTTXから送信されたメッセージを受信できます。これがMQTTメッセージの送受信です!!

CleanShot 2024-12-29 at 23.36.14.png

MQTTX側のメッセージは任意なので、好きに変更してもらって大丈夫。メッセージ変更後再度メッセージを送信すると、変更されたメッセージが受信できます。

CleanShot 2024-12-29 at 23.38.53.png

MQTTX側とAWS IoT Core側で指定したトピックが一致していないと、サブスクライバー側でメッセージを受信できません。送信トピックを編集するなどして、メッセージが受信できるかどうかいくらかパターンを試してみてください。

トピックフィルターには、#+のワイルドカードが利用できます。

  • #:複数レベルのワイルドカード文字
  • +:単一レベルのワイルドカード文字
トピックのフィルター 次でメッセージを表示します
# 任意のトピック名
topic_1/# topic_1/ で始まるトピック名
topic_1/level_2/# topic_1/level_2/ で始まるトピック名
topic_1/+/level_3 topic_1/ で始まり、/level_3で終わり、その間に任意の値の1つの要素があるトピック名。

ワイルドカードの詳細は、以下の公式ドキュメントを参照してください。

AWS IoT MQTT クライアントでデバイスの MQTT メッセージを表示する - AWS IoT Core

MQTTXとAWS IoT Coreとの接続確認(AWS IoT Coreからパブリッシュ)

前章ではMQTTXからAWS IoT Coreにメッセージをパブリッシュしましたが、AWS IoT CoreのMQTTテストクライアントを利用して、AWS IoT CoreからMQTTXに対してメッセージをパブリッシュできます。

先述の手順とは逆で、今度はMQTTX側でサブスクリプションを設定します。[New Subcription]ボタンをクリック。

CleanShot 2024-12-29 at 23.52.29.png

サブスクリプション設定画面でTopicにtopic/mqttxを入力し、[Confirm]をクリックしサブスクリプションを作成しておきます。

CleanShot 2024-12-29 at 23.54.02.png

そうすると、中央に指定したTopicのサブスクリプションが表示されます。

CleanShot 2024-12-29 at 23.54.38.png

AWS IoT Core側から先程のMQTTテストクライアントで、[トピックに公開する]タブを選択し、トピック名にtopic/mqttxを入力し、適当なメッセージを入力し[発行]ボタンをクリックしてメッセージを発行します。

CleanShot 2024-12-30 at 11.31.53.png

MQTTX側の画面を確認し、送信メッセージが受信できていればOKです!!

CleanShot 2024-12-29 at 23.56.24.png

応用:MQTTXからスクリプトを利用してメッセージをパブリッシュする

MQTTXには、独自のスクリプトを利用してメッセージをパブリッシュする機能があります。固定的なメッセージの手動送信ではなく、特定のユースケースやニーズに合わせたシナリオを自由に記述し実行できます。例えば、IoTデバイスを模擬した、気温と湿度のパブリッシュなど。

こちらに、スクリプト機能の公式ドキュメントがあるので、気になる方は参考にしてください。

Script - MQTTX Documentation

スクリプト機能については、弊社市田善久のこちらにも日本語で詳しく紹介されているので合わせて参考にしてもらえれば。

独自スクリプトも実行できる!モダンでクールな MQTT クライアント「MQTT X」の紹介 | DevelopersIO

一点、これは公式ドキュメントにも記載(更新)がされていないのですが、筆者が試したV1.11.1では、スクリプトの定期実行機能の[Timed Message]が、メッセージ上部の上矢印ボタンの中に入っていたので注意してください。

CleanShot 2024-12-30 at 00.29.23.png

このスクリプト機能は、MQTTクライアントとして利用の幅が非常に広がるので是非一度試してもらえればと思います。サンプルも以下で公開されています。

https://github.com/emqx/MQTTX/tree/main/scripts-example/function

その他参考情報

AWS IoT Coreの入門周りで参考になりそうな情報を以下にまとめました。

MQTTX以外のMQTTクライアントツール

参考までに、MQTTX以外の代表的なMQTTクライアントをまとめてみました。MQTTX以外も気になった方はこちらも見てもらえれば。

ツール名 プラットフォーム 機能 価格
MQTTX macOS, Linux, Windows クロスプラットフォーム、MQTT v3.1.1およびMQTT v5.0のサポート、複数接続の管理、直感的なパブリッシング/サブスクリビングインターフェース、SSL認証対応 無料
MQTT Explorer Windows, macOS, Linux トピックの視覚化、リアルタイムデータ監視、メッセージの公開と購読、ユーザーフレンドリーなインターフェース 無料
Paho MQTT Windows, macOS, Linux MQTT v3.1, v3.1.1, v5.0サポート、自動再接続、オフライン時のメッセージバッファリング、セキュリティメカニズムのサポート 無料
Mosquitto CLI Windows, macOS, Linux 軽量設計、MQTT v5.0および3.1.1のサポート、デバッグモード、TLS証明書接続のサポート 無料
MQTT.fx Windows, macOS, Linux GUIベースのMQTTデバッグおよびテストツール、パブリッシュ/サブスクライブ機能、リアルタイムログ、メッセージ記録、スクリプト自動化 €49.90

ラズペリーパイを利用したAWS IoT Coreのチュートリアル

ラズペリーパイを利用した場合のチュートリアルは、AWSの公式マニュアルに記載されています。一通りAWS IoT Coreに慣れた後には、実際のエッジデバイスを利用した接続を試してみるとよいかと思います。めっちゃ楽しいです。

https://docs.aws.amazon.com/iot/latest/developerguide/iot-tutorials-dc-intro.html

エッジデバイスとAWS IoT CoreのMQTT以外の接続方式

今回は、MQTTXとAWS IoT Coreとの接続にMQTTを利用しましたが、接続方式は他にもあります。それぞれ利用シーンや特徴が違うので、ここにまとめておきます。

接続方法 プロトコル 認証方式 特徴
MQTT MQTT (ポート8883) X.509クライアント証明書 - セキュアな双方向通信
- QoS 0と1をサポート
- 長時間の接続維持が可能
- デバイスSDKで簡単に実装可能
MQTT over WebSocket MQTT over WSS (ポート443) SigV4 または カスタム認証 - ファイアウォールフレンドリー
- ウェブブラウザからの接続が可能
- 既存のHTTP/HTTPS基盤を利用可能
HTTPS HTTPS (ポート443) X.509クライアント証明書、SigV4、またはカスタム認証 - 単方向通信(デバイスからの発行のみ)
- ステートレスな通信
- 短時間の接続に適している
  1. MQTT:

    • 最も一般的で推奨される方法
    • リアルタイムな双方向通信に適している
    • デバイスSDKを使用することで、認証やセキュリティの実装が容易
  2. MQTT over WebSocket:

    • Webアプリケーションやブラウザベースのクライアントに適している
    • 既存のHTTP/HTTPS基盤を活用できる
    • ファイアウォールの制限がある環境でも使用しやすい
  3. HTTPS:

    • シンプルな実装が可能
    • データの送信のみが必要な場合に適している
    • 既存のHTTPSクライアントライブラリを利用可能

選択する方法は、デバイスの能力、ネットワーク環境、セキュリティ要件、アプリケーションの特性などに応じて決定します。多くの場合、MQTTまたはMQTT over WebSocketが推奨されますが、特定のユースケースではHTTPSも適切な選択肢となる場合もあります。

まずは手元のPCでMQTTとAWS IoTを体感してみよう!!

以上、MQTTXを利用したAWS IoT CoreとのMQTTメッセージのやり取りをチュートリアル的に紹介しました。AWS IoTについて初めて触れる方は慣れない部分もあったかと思いますが、ここまで通してみることで、基本的なIoTに関する用語が理解できたのではと思います。

この後は、エッジデバイス(ラズベリーパイやESP32)を用意してメッセージをパブリッシュしてみる、AWS IoT Core側でサブスクライブしたメッセージのDynamoDBやAuroraへの格納、AWS IoT Core側からのパブリッシュによるデバイスの制御、データソースに格納したデータのGrafanaダッシュボードによる可視化など、応用しだいでさまざまなことが実現できます。

この記事が、皆さんのAWS IoTの最初の一歩として参考になれば幸いです。

それでは今日はこのへんで。濱田孝治(ハマコー)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.